#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>

#define NUM 10

typedef void(*pfunc)(); // pfun  函数指针
pfunc HandleTask[NUM]; // 任务数组
// 任务
void task1()
{
    //...
}
void task2()
{
    //...
}
void task3()
{
    //...
}
void LoadTask()
{
    // 加载任务
    memset(HandleTask, 0, sizeof(HandleTask));
    HandleTask[0] = task1;
    HandleTask[1] = task2;
    HandleTask[2] = task3;
}
int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        // child process
        int cnt = 10;
        while(cnt)
        {
            printf("我是子进程, pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt--);
            sleep(1);
        }
        exit(10);
    }
    // parent process
    sleep(15);
   // pid_t ret_id = wait(NULL);
    int status = 0;
   // pid_t ret_id = waitpid(id, &status, 0);// 阻塞时等待子进程
    // 轮询非阻塞等待
    while(1)
    {
        pid_t ret_id = waitpid(id+1, &status, WNOHANG);// 非阻塞时等待
        if(ret_id > 0)
        {
            // 等待成功，即waitpid调用成功，且子进程已退出
            
            // 判断进程是否正常退出
            if(WIFEXITED(status))
            {
                // 进程正常退出
                //
                // 判断子进程的运行结果是否正确
                printf("退出码：%d\n", WEXITSTATUS(status));
            }
            else
            {
                // 进程异常
                printf("子进程异常结束\n");
            }
            break;
           // printf("wait successfully: %d, 终止信号:%d, 子进程退出码:%d\n", ret_id, (status & 0x7f), ((status >> 8) & 0xff));
        }
        else if(ret_id == 0)
        {
            // waitpid没有等待失败，仅仅是检测到子进程未退出
            printf("child process is running\n");
            // 父进程执行其他的任务
            for(int i = 0; HandleTask[i] != NULL; ++i)
                // memest 已经将数组中空余的位置设置为0
            {
                HandleTask[i]();// 函数回调，在父进程空闲时，执行其他需要的任务
            }
        }
        else
        {
            // 父进程等待失败
            printf("wait fail\n");
            break;
        }
        sleep(1);
    }
   // sleep(2);

    //pid_t id = fork();
    //if(id < 0)
    //{
    //    perror("fork fail");
    //    exit(1);
    //}
    //else if(id == 0)
    //{
    //    while(1)
    //    {
    //        printf("child process, pid:%d, ppid:%d\n", getpid(), getppid());
    //        sleep(2);
    //    }
    //}
    //else
    //{
    //    while(2)
    //    {
    //        printf("parent process, pid:%d, ppid:%d\n", getpid(), getppid());
    //        sleep(1);
    //    }
    //}


    return 0;
}
